Программирование драйверов Windows

Секция [DDInstall.Services]


Чтобы скопированные в положенное место файлы действительно заработали как настоящий драйвер, необходимо надлежащим образом уведомить SCM Менеджер. Соответственно, для этого необходимо иметь записи в системном Реестре в разделе HKLM\System\CurrentControlSet\Services

по поводу каждого драйвера.

В Windows 2000/XP/2003 работа по регистрации драйвера вынесена в отдельный тип секций [DDInstall.Services].

Можно считать, что данная секция является придатком секции [DDInstall] и всего лишь конкретизирует, какие секции inf-файла (service-install-section) определяют, что именно будет внесено/удалено в Системный Реестр в рамках установки драйвера. В Windows 98 следовало пользоваться директивой AddReg

в секции [DDInstall]. В Windows 2000 inf-файл стал сложнее, и работа с Системным Реестром была выделена в еще один "промежуточный" тип секций [DDInstall.Services].

В том случае, если имя [DDInstall] секции декорировано одним из суффиксов .nt, .ntx86 или ntia64 (что означает принятие к исполнению данной секции только в соответствующей операционной системе), то суффикс .Services

следует присоединять именно к получившемуся декорированному имени [DDInstall.Xxx].

Среди записей секции [DDInstall.Xxx.Services] имеется обязательная директива AddService (помимо еще трех необязательных), которая имеет вид:

AddService=service-name,[flags],service-install-section[ ,eventlog-install-section[,event-log[,event-name]]]

где service-name представляет название сервиса, что обычно совпадает с названием Драйвера (если отбросить расширение .sys). Подраздел с таким именем будет создан в результате инсталляции в разделе Системного Реестра HKLM\System\CurrentControlSet\Services.

Директив AddService в секциях [DDInstall.Xxx.Services] может быть несколько.

Возможные значения поля flags приводятся в таблице 12.4. Можно вводить значения, которые представляют "побитовое ИЛИ" указанных в таблице значений.

Значение поля service-install-section и необязательное для ввода значение поля eventlog-install-section (ссылка на секцию, где описывается установка сервисов протоколирования) объявляют имена секций INF файла типа [ServiceInstall], например:




[Manufacturer] ; секция описания поставщиков %ThisMfg%=DeviceList

[DeviceList] ; секция описания моделей %Model1%= Model1_Inst, _MXX0001 ; &#60- идентификатор

[Model1_Inst.ntx86] ; [DDInstall] секция инсталляции для NT . . . . [Model1_Inst.ntx86.Services] ; установка драйвера как сервиса Mxx0001 ; Поле flags имеет значение 0x0002 (см. таблицу 12.4) ; ссылка на секцию [ServiceInstall] AddService= Mxx0001, 0x0002, MODEL1_ADDSERVICE_SECTION

[MODEL1_ADDSERVICE_SECTION] ; секция [service-install-section] DisplayName = %Model1.ServiceDesc% ServiceType = 1 ; = SERVICE_KERNEL_DRIVER, см. ntddk.h, wdm.h StartType = 3 ; = SERVICE_DEMAND_START, см. ntddk.h, wdm.h ErrorControl = 1 ; = SERVICE_ERROR_NORMAL, см. ntddk.h, wdm.h ServiceBinary= %12%\SpecialDrv.sys

[Strings] ; Расшифровка значений ThisMfg= "This Manufacturer" Model1= "Model1 (made by This Manufacturer)" Model1.ServiceDesc= "Model1 Special Driver v.1.000"

Таблица 12.4. Значения flags

директивы AddService

Значение Символьное имя SPSVCINST_Xxx Описание
0x0002 SPSVCINST_ASSOCSERVICE Драйвер является функциональным драйвером или драйвером в "стиле-NT"
0x0008 ...NOCLOBBER_DISPLAYNAME Не переписывать существовавшее в Системном Реестре значение DisplayName, если такой сервис уже был установлен ранее
0x0100 ...NOCLOBBER_DESCRIPTION Не переписывать описание
0x0010 ...NOCLOBBER_STARTTYPE Не переписывать StartType
0x0020 ...NOCLOBBER_ERRORCONTROL Не переписывать ErrorControl
0x0040 ...NOCLOBBER_LOADORDERGROUP Не переписывать LoadOrderGroup
0x0080 ...NOCLOBBER_DEPENDENCIES Не переписывать Dependencies
Более подробно организация секций типа [ServiceInstall] (включающих директивы DisplayName, ServiceType, StartType

и т.п.) будет рассмотрена далее, после описания секций типа [AddReg].

В секциях типа [DDInstall.Services] могут быть введены директивы DelService (удаления ранее установленных сервисов), Include (включения текста внешних inf-файлов) и директива Needs.Для получения информации по данным необязательным директивам следует обратиться к соответствующей документации, например, документации DDK.


Содержание раздела